﻿Imports System.Web
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports NHibernate
Imports SIAVU.Dominio

Namespace Persistencia

    Public Class EntityManagerPersistencia

        Public Overridable Function GetPostas(ByVal Anio As Integer, ByVal mes As Integer) As List(Of Posta)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession
                'Return session.CreateCriteria(GetType(Posta)).CreateAlias("VueloIda", "VueloIda").Add(Criterion.Expression.Between("VueloIda.FechaSalida", New Date(Anio, mes, 1), New Date(Anio, mes, 1).AddMonths(10).AddDays(-1))).List(Of Posta)()
                Return session.CreateCriteria(GetType(Posta)).CreateAlias("VueloIda", "VueloIda").Add(Criterion.Expression.Between("VueloIda.FechaSalida", _
                                                                                                                                   CDate(Anio.ToString() + "/" + mes.ToString() + "/01"), _
                                                                                                                                   CDate(Anio.ToString() + "/" + mes.ToString() + "/" + UIManager.CantidadDiasDelMes(mes).ToString()).AddDays(1).AddSeconds(-1))).List(Of Posta)()

            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Overridable Function getUsuariosControlBusqueda(Optional ByVal Legajo As Long = Nothing, Optional ByVal NombreCompleto As String = Nothing, Optional ByVal AvionID As Long = Nothing, Optional ByVal bMostrarInconsistentes As Boolean = False) As IList(Of Usuario)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession

                Dim objCriteria As ICriteria
                objCriteria = session.CreateCriteria(GetType(Usuario))
                If Legajo <> Nothing Then
                    objCriteria.Add(Criterion.Expression.Eq("Legajo", Legajo))
                End If

                If NombreCompleto <> Nothing Then
                    objCriteria.Add(Criterion.Expression.Like("NombreCompleto", "%" + NombreCompleto + "%"))
                End If

                If AvionID <> Nothing Then
                    objCriteria.CreateAlias("AvionesPermitidos", "AvionesPermitidos").Add(Criterion.Expression.Eq("AvionesPermitidos.AvionID", AvionID))
                End If

                If bMostrarInconsistentes <> False Then
                    objCriteria = objCriteria.CreateAlias("PlanesVuelos", "PlanesVuelos")
                    objCriteria = objCriteria.CreateAlias("PlanesVuelos.Actividades", "Actividades")
                    objCriteria = objCriteria.CreateAlias("PlanesVuelos.Plazo", "Plazo")
                    objCriteria.Add(Criterion.Expression.Eq("PlanesVuelos.TipoProgramacion", ETipoProgramacion.PlanVuelo))
                    objCriteria.Add(Criterion.Expression.Eq("Actividades.EstadoActividad", EEstadoActividad.Desconocido))
                    objCriteria.Add(Criterion.Expression.Eq("Plazo.Mes", Date.Now.Month)) 'Filtro por las actividades de este mes
                    objCriteria.Add(Criterion.Expression.Eq("Plazo.Anio", Date.Now.Year)) 'Filtro por las actividades de este mes
                End If

                objCriteria = objCriteria.SetResultTransformer(Criterion.CriteriaSpecification.DistinctRootEntity)

                Return objCriteria.List(Of Usuario)()

            Catch ex As Exception
                Throw

            Finally
                session.Close()
            End Try
        End Function

        Public Overridable Function GetDestinosSinBuenosAires() As List(Of Ciudad)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession
                Return session.CreateCriteria(GetType(Ciudad)).Add(Criterion.Expression.Not(Criterion.Expression.Eq("Descripcion", "Buenos Aires"))).List(Of Ciudad)()
            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Overridable Function GetAviones() As List(Of Avion)
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession
                Return session.CreateCriteria(GetType(Avion)).List(Of Avion)()
            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Overridable Function GetTripulantesParaConfirmar(ByVal PostaID As Long, ByVal TipoProgramacionID As ETipoProgramacion) As IList
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession

                Dim objQuery As IQuery
                Dim strQuery As String = String.Empty

                strQuery = "select U.UsuarioID as UsuarioID, U.Legajo as Legajo, U.NombreCompleto as NombreCompleto, A.EstadoActividad as EstadoActividad, A.Observacion, A.ActividadID " + _
                            "from Usuario as U inner join U.PlanesVuelos as P inner join P.Actividades as A where P.TipoProgramacion = :tipoProgramacionID and A.PostaID = :PostaID"
                objQuery = session.CreateQuery(strQuery)
                objQuery.SetParameter("tipoProgramacionID", TipoProgramacionID)
                objQuery.SetParameter("PostaID", PostaID)
              

                Return objQuery.List
            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Overridable Function GetUsuariosDeguardia(ByVal TipoProgramacionID As ETipoProgramacion) As IList(Of Usuario)
            Dim session As ISession = Nothing

            Try
                session = NHibernateHelper.OpenSession

                Dim objCriteria As ICriteria

                objCriteria = session.CreateCriteria(GetType(Usuario))

                objCriteria = objCriteria.CreateAlias("PlanesVuelos", "Programacion")
                objCriteria = objCriteria.CreateAlias("Programacion.Actividades", "ActividadesProgramacion")
                objCriteria = objCriteria.SetResultTransformer(Criterion.CriteriaSpecification.DistinctRootEntity)

                objCriteria.Add(Criterion.Expression.Eq("ActividadesProgramacion.TipoActividad", ETipoActividad.Guardia))
                objCriteria.Add(Criterion.Expression.Eq("Programacion.TipoProgramacion", TipoProgramacionID))
                objCriteria.Add(Criterion.Expression.Between("ActividadesProgramacion.FechaInicio", Date.Now.Date, Date.Now.Date.AddDays(1).AddSeconds(-1)))

                Return objCriteria.List(Of Usuario)()

                Return Nothing

            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        Public Overridable Function GetUsuariosConActividadesByFecha(ByVal Fecha As Date, ByVal TipoProgramacionID As Integer) As IList
            Dim session As ISession = Nothing
            Try
                session = NHibernateHelper.OpenSession

                Dim objQuery As IQuery
                objQuery = session.CreateQuery("select U.UsuarioID as UsuarioID, U.Legajo as Legajo, U.NombreCompleto as NombreCompleto, A.EstadoActividad as EstadoActividad  from Usuario as U inner join U.PlanesVuelos as P inner join P.Actividades as A where P.TipoProgramacion = :tipoProgramacionID and A.FechaInicio between :start and :end")
                objQuery.SetParameter("tipoProgramacionID", TipoProgramacionID)
                objQuery.SetParameter("start", Fecha.Date)
                objQuery.SetParameter("end", Fecha.Date.AddDays(1).AddSeconds(-1))

                Return objQuery.List
            Catch ex As Exception
                Throw
            Finally
                session.Close()
            End Try
        End Function

        'Public Overridable Sub ConfimarTripulantesSacarGuardia(ByVal ListaUsuarioParaConfirmar As DataTable)
        '    Dim session As ISession = NHibernateHelper.OpenSession()
        '    Dim oTransaccion As ITransaction = Nothing
        '    Dim oUsuario As New Usuario

        '    Try
        '        '//Abro una transacción general para toda la actualización
        '        oTransaccion = session.BeginTransaction()
        '        oTransaccion.Begin()

        '        If (ListaUsuarioParaConfirmar IsNot Nothing) Then
        '            For Each drAux As DataRow In ListaUsuarioParaConfirmar.Rows
        '                If drAux("Modificada").ToString() = DataRowState.Modified.ToString() Then
        '                    oUsuario.UsuarioID = drAux("UsuarioID")
        '                    If drAux("EstadoActividadFuturo") = EEstadoActividad.Realizado.ToString Then
        '                        '//Es un usuario que realiza el vuelo
        '                        oUsuario.ConfimarVuelo(CLng(drAux("ActividadID")), True, session)
        '                    Else
        '                        '//Es un usuario que no realiza el vuelo y por ende se le asigna una guardia
        '                        oUsuario.ConfimarVuelo(CLng(drAux("ActividadID")), False, session)
        '                        oUsuario.SacarDeGuardia(CLng(drAux("ActividadID")), drAux("Observacion").ToString.Trim, CLng(drAux("AsignarGuardia")), session)
        '                    End If
        '                End If
        '            Next
        '        End If

        '        '//Comiteo todos los cambios realizados
        '        oTransaccion.Commit()

        '    Catch ex As Exception
        '        '//Si algo falla vuelvo TODO para atrás
        '        oTransaccion.Rollback()
        '        Throw

        '    Finally
        '        session.Close()
        '    End Try
        'End Sub

        Public Overridable Sub ConfimarTripulantesSacarGuardia(ByVal oListObjetosParaActualizar As List(Of Object))
            Dim session As ISession = NHibernateHelper.OpenSession()
            Dim oTransaccion As ITransaction = Nothing
            Dim oUsuario As New Usuario

            Try
                If (oListObjetosParaActualizar IsNot Nothing) AndAlso (oListObjetosParaActualizar.Count > 0) Then
                    '//Abro una transacción general para toda la actualización
                    oTransaccion = session.BeginTransaction()
                    oTransaccion.Begin()

                    For Each oObjeto As Object In oListObjetosParaActualizar
                        session.SaveOrUpdate(oObjeto)
                    Next

                    '//Comiteo todos los cambios realizados
                    oTransaccion.Commit()
                End If

            Catch ex As Exception
                '//Si algo falla vuelvo TODO para atrás
                oTransaccion.Rollback()
                Throw

            Finally
                session.Close()
            End Try
        End Sub

    End Class

End Namespace

